创建时间: | 2019/1/25 9:41 |
来源: | https://blog.csdn.net/linhaiyun_ytdx/article/details/81254690 |
1.1 该方式为默认方式,流程启动方式和其他流程的启动方式一致
- 1String processDefinitionKey = "receiveTask"; //流程定义的key
- 2 ProcessInstance pi = processEngine.getRuntimeService() //与正在执行的流程实例和执行对象相关的Service
- 3 .startProcessInstanceByKey(processDefinitionKey);
1.2 流程图中任务节点的配置如下:
1.3 说明
- 1 区别在于:如果是个人任务TYPE的类型表示participant(参与者)
- 2
- 3 如果是组任务TYPE的类型表示candidate(候选者)和participant(参与者)
2.分配个人任务方式二(使用流程变量)
2.1 该流程在启动流程实例时,通过HashMap设置流程变量,赋值给执行的流程实例
- 1package com.ytdx.groupTask;
- 2
- 3import java.io.InputStream;
- 4import java.util.HashMap;
- 5import java.util.List;
- 6import java.util.Map;
- 7
- 8import org.activiti.engine.ProcessEngine;
- 9import org.activiti.engine.ProcessEngines;
- 10import org.activiti.engine.history.HistoricIdentityLink;
- 11import org.activiti.engine.repository.Deployment;
- 12import org.activiti.engine.runtime.ProcessInstance;
- 13import org.activiti.engine.task.IdentityLink;
- 14import org.activiti.engine.task.Task;
- 15import org.junit.Test;
- 16
- 17/**
- 18 * 分配个人任务方式二(使用流程变量)
- 19 * @author lhy
- 20 *
- 21 */
- 22public class TaskTest {
- 23
- 24 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
- 25
- 26 /**
- 27 * 部署流程定义(从inputStream)
- 28 */
- 29 @Test
- 30 public void deploymentProcess_inputStream(){
- 31 InputStream inputStreamBpmn = this.getClass().getClassLoader().getResourceAsStream("GroupTask.bpmn");
- 32 InputStream inputStreamPng = this.getClass().getClassLoader().getResourceAsStream("GroupTask.png");
- 33 Deployment deployment = processEngine.getRepositoryService() //与流程定义和部署对象相关的Service
- 34 .createDeployment() //创建一个部署对象
- 35 .name("组任务一") //添加部署的名称
- 36 .addInputStream("GroupTask.bpmn", inputStreamBpmn)
- 37 .addInputStream("GroupTask.png", inputStreamPng)
- 38 .deploy(); //完成部署
- 39 System.out.println("部署ID:"+deployment.getId());
- 40 System.out.println("部署名称:"+deployment.getName());
- 41 }
- 42
- 43 /**
- 44 * 启动流程实例
- 45 */
- 46 @Test
- 47 public void startProcessInstance(){
- 48 String processDefinitionKey = "GroupTask"; //流程定义的key
- 49 /**启动流程实例的同时,设置流程变量,使用流程变量用来指定任务的办理人,对应GroupTask.bpmn文件中#{userIDs}*/
- 50 Map<String, Object> variables = new HashMap<String, Object>();
- 51 variables.put("userIDs", "大大,中中,小小");
- 52 ProcessInstance pi = processEngine.getRuntimeService() //与正在执行的流程实例和执行对象相关的Service
- 53 .startProcessInstanceByKey(processDefinitionKey,variables); //使用流程定义的key启动流程实例,key对应task.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
- 54 System.out.println("流程实例ID:"+pi.getId());
- 55 System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
- 56 }
- 57
- 58 /**
- 59 * 查询当前人的个人任务
- 60 */
- 61 @Test
- 62 public void findPersonalTask(){
- 63 String assignee = "海哥";
- 64 List<Task> list = processEngine.getTaskService() //与正在执行的任务管理相关的Service
- 65 .createTaskQuery() //创建任务查询对象
- 66 /**查询条件(where部分)*/
- 67 .taskAssignee(assignee) //指定个人任务查询,指定办理人
- 68// .taskCandidateUser(candidateUser) //组任务的办理人查询
- 69 /**排序*/
- 70 .orderByTaskCreateTime().asc() //使用创建时间的升序排列
- 71 /**返回结果集*/
- 72 .list(); //返回列表
- 73
- 74 if(list!=null && list.size()>0){
- 75 for(Task task:list){
- 76 System.out.println("任务ID:"+task.getId());
- 77 System.out.println("任务名称:"+task.getName());
- 78 System.out.println("任务的创建时间:"+task.getCreateTime());
- 79 System.out.println("任务的办理人:"+task.getAssignee());
- 80 System.out.println("流程实例ID:"+task.getProcessInstanceId());
- 81 System.out.println("执行对象ID:"+task.getExecutionId());
- 82 System.out.println("流程定义ID:"+task.getProcessDefinitionId());
- 83 System.out.println("########################################################");
- 84 }
- 85 }
- 86 }
- 87
- 88 /**
- 89 * 查询当前人的组任务
- 90 */
- 91 @Test
- 92 public void findGroupTask(){
- 93 String candidateUser = "小小";
- 94 List<Task> list = processEngine.getTaskService() //与正在执行的任务管理相关的Service
- 95 .createTaskQuery() //创建任务查询对象
- 96 /**查询条件(where部分)*/
- 97 .taskCandidateUser(candidateUser) //组任务的办理人查询
- 98 /**排序*/
- 99 .orderByTaskCreateTime().asc() //使用创建时间的升序排列
- 100 /**返回结果集*/
- 101 .list(); //返回列表
- 102 if(list!=null && list.size()>0){
- 103 for(Task task:list){
- 104 System.out.println("任务ID:"+task.getId());
- 105 System.out.println("任务名称:"+task.getName());
- 106 System.out.println("任务的创建时间:"+task.getCreateTime());
- 107 System.out.println("任务的办理人:"+task.getAssignee());
- 108 System.out.println("流程实例ID:"+task.getProcessInstanceId());
- 109 System.out.println("执行对象ID:"+task.getExecutionId());
- 110 System.out.println("流程定义ID:"+task.getProcessDefinitionId());
- 111 System.out.println("########################################################");
- 112 }
- 113 }
- 114 }
- 115
- 116 /**
- 117 * 完成我的任务
- 118 */
- 119 @Test
- 120 public void completePersonalTask(){
- 121 String taskId = "4905";
- 122 processEngine.getTaskService() //与正在执行的任务管理相关的Service
- 123 .complete(taskId);
- 124 System.out.println("完成任务:任务ID:"+taskId);
- 125 }
- 126
- 127 /**
- 128 * 查询正在执行的任务办理人表
- 129 */
- 130 @Test
- 131 public void findRunPersonTask(){
- 132 String taskId = "5205";
- 133 List<IdentityLink> list = processEngine.getTaskService()
- 134 .getIdentityLinksForTask(taskId);
- 135 if(list!=null && list.size()>0){
- 136 for(IdentityLink identityLink:list){
- 137 System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
- 138 }
- 139 }
- 140 }
- 141
- 142 /**
- 143 * 查询历史任务的办理人表
- 144 */
- 145 @Test
- 146 public void findHistoryPersonTask(){
- 147 String processInstanceId = "101"; //PROC_INST_ID_ 字段
- 148 List<HistoricIdentityLink> list = processEngine.getHistoryService()
- 149 .getHistoricIdentityLinksForProcessInstance(processInstanceId);
- 150 if(list!=null && list.size()>0){
- 151 for(HistoricIdentityLink identityLink:list){
- 152 System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
- 153 }
- 154 }
- 155 }
- 156
- 157 /**
- 158 * 拾取任务,将组任务分给个人任务,指定任务的办理人字段
- 159 */
- 160 @Test
- 161 public void claim(){
- 162 String taskId = "2203"; //任务ID
- 163 String userId = "大大"; //分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员),给字段ASSIGNEE_赋值
- 164 processEngine.getTaskService()
- 165 .claim(taskId, userId);
- 166 }
- 167
- 168 /**
- 169 * 将个人任务回退到组任务,前提,之前一定是个组任务
- 170 */
- 171 @Test
- 172 public void setAssigee(){
- 173 String taskId = "2203";
- 174 processEngine.getTaskService()
- 175 .setAssignee(taskId, null);
- 176 }
- 177
- 178 /**
- 179 * 向组任务中添加成员(act_hi_identitylink表中查)
- 180 */
- 181 @Test
- 182 public void addGroupUser(){
- 183 String taskId = "2203";
- 184 String userId = "小Y"; //成员办理人
- 185 processEngine.getTaskService()
- 186 .addCandidateUser(taskId, userId);
- 187 }
- 188
- 189 /**
- 190 * 从组任务中删除成员
- 191 */
- 192 @Test
- 193 public void deleteGroupUser(){
- 194 String taskId = "2203";
- 195 String userId = "小Y"; //成员办理人
- 196 processEngine.getTaskService()
- 197 .deleteCandidateUser(taskId, userId);
- 198 }
- 199}
2.2 流程图中任务节点的配置
2.3 说明
3.1 该流程实例在启动时,通过调用监听的TaskListenerImpl类,分配组任务的办理人
- 1package com.ytdx.groupTask;
- 2
- 3import org.activiti.engine.delegate.DelegateTask;
- 4import org.activiti.engine.delegate.TaskListener;
- 5
- 6@SuppressWarnings("serial")
- 7public class TaskListenerImpl implements TaskListener {
- 8
- 9 /**
- 10 * 用来指定任务的办理人
- 11 */
- 12 @Override
- 13 public void notify(DelegateTask delegateTask) {
- 14 //指定个人任务的办理人,也可以指定组任务的办理人
- 15 //个人任务:通过类去查询数据库,将下一个任务的办理人查询获取,然后通过setAssignee()的方法指定任务的办理人
- 16 //delegateTask.setAssignee("海哥");
- 17 //组任务:
- 18 delegateTask.addCandidateUser("郭靖");
- 19 delegateTask.addCandidateUser("黄蓉");
- 20 }
- 21
- 22}
- 1package com.ytdx.groupTask;
- 2
- 3import java.io.InputStream;
- 4import java.util.List;
- 5
- 6import org.activiti.engine.ProcessEngine;
- 7import org.activiti.engine.ProcessEngines;
- 8import org.activiti.engine.history.HistoricIdentityLink;
- 9import org.activiti.engine.repository.Deployment;
- 10import org.activiti.engine.runtime.ProcessInstance;
- 11import org.activiti.engine.task.IdentityLink;
- 12import org.activiti.engine.task.Task;
- 13import org.junit.Test;
- 14
- 15/**
- 16 * 分配个人任务方式二(使用类)
- 17 * @author lhy
- 18 *
- 19 */
- 20public class GroupTaskTest {
- 21ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
- 22
- 23 /**
- 24 * 部署流程定义(从inputStream)
- 25 */
- 26 @Test
- 27 public void deploymentProcess_inputStream(){
- 28 InputStream inputStreamBpmn = this.getClass().getClassLoader().getResourceAsStream("GroupTasks.bpmn");
- 29 InputStream inputStreamPng = this.getClass().getClassLoader().getResourceAsStream("GroupTasks.png");
- 30 Deployment deployment = processEngine.getRepositoryService() //与流程定义和部署对象相关的Service
- 31 .createDeployment() //创建一个部署对象
- 32 .name("组任务二") //添加部署的名称
- 33 .addInputStream("GroupTasks.bpmn", inputStreamBpmn)
- 34 .addInputStream("GroupTasks.png", inputStreamPng)
- 35 .deploy(); //完成部署
- 36 System.out.println("部署ID:"+deployment.getId());
- 37 System.out.println("部署名称:"+deployment.getName());
- 38 }
- 39
- 40 /**
- 41 * 启动流程实例
- 42 */
- 43 @Test
- 44 public void startProcessInstance(){
- 45 String processDefinitionKey = "GroupTasks"; //流程定义的key
- 46 ProcessInstance pi = processEngine.getRuntimeService() //与正在执行的流程实例和执行对象相关的Service
- 47 .startProcessInstanceByKey(processDefinitionKey); //使用流程定义的key启动流程实例,key对应task.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
- 48 System.out.println("流程实例ID:"+pi.getId());
- 49 System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
- 50 }
- 51
- 52 /**
- 53 * 查询当前人的个人任务
- 54 */
- 55 @Test
- 56 public void findPersonalTask(){
- 57 String assignee = "郭靖";
- 58 List<Task> list = processEngine.getTaskService() //与正在执行的任务管理相关的Service
- 59 .createTaskQuery() //创建任务查询对象
- 60 /**查询条件(where部分)*/
- 61 .taskAssignee(assignee) //指定个人任务查询,指定办理人
- 62// .taskCandidateUser(candidateUser) //组任务的办理人查询
- 63 /**排序*/
- 64 .orderByTaskCreateTime().asc() //使用创建时间的升序排列
- 65 /**返回结果集*/
- 66 .list(); //返回列表
- 67
- 68 if(list!=null && list.size()>0){
- 69 for(Task task:list){
- 70 System.out.println("任务ID:"+task.getId());
- 71 System.out.println("任务名称:"+task.getName());
- 72 System.out.println("任务的创建时间:"+task.getCreateTime());
- 73 System.out.println("任务的办理人:"+task.getAssignee());
- 74 System.out.println("流程实例ID:"+task.getProcessInstanceId());
- 75 System.out.println("执行对象ID:"+task.getExecutionId());
- 76 System.out.println("流程定义ID:"+task.getProcessDefinitionId());
- 77 System.out.println("########################################################");
- 78 }
- 79 }
- 80 }
- 81 /**
- 82 * 查询当前人的组任务
- 83 */
- 84 @Test
- 85 public void findMyGroupTask(){
- 86 String candidateUser = "郭靖";
- 87 List<Task> list = processEngine.getTaskService() //与正在执行的任务管理相关的Service
- 88 .createTaskQuery() //创建任务查询对象
- 89 /**查询条件(where部分)*/
- 90 .taskCandidateUser(candidateUser) //组任务的办理人查询
- 91 /**排序*/
- 92 .orderByTaskCreateTime().asc() //使用创建时间的升序排列
- 93 /**返回结果集*/
- 94 .list(); //返回列表
- 95 if(list!=null && list.size()>0){
- 96 for(Task task:list){
- 97 System.out.println("任务ID:"+task.getId());
- 98 System.out.println("任务名称:"+task.getName());
- 99 System.out.println("任务的创建时间:"+task.getCreateTime());
- 100 System.out.println("任务的办理人:"+task.getAssignee());
- 101 System.out.println("流程实例ID:"+task.getProcessInstanceId());
- 102 System.out.println("执行对象ID:"+task.getExecutionId());
- 103 System.out.println("流程定义ID:"+task.getProcessDefinitionId());
- 104 System.out.println("########################################################");
- 105 }
- 106 }
- 107 }
- 108
- 109 /**
- 110 * 完成我的任务
- 111 */
- 112 @Test
- 113 public void completePersonalTask(){
- 114 String taskId = "6404";
- 115 processEngine.getTaskService() //与正在执行的任务管理相关的Service
- 116 .complete(taskId);
- 117 System.out.println("完成任务:任务ID:"+taskId);
- 118 }
- 119
- 120 /**
- 121 * 查询正在执行的任务办理人表
- 122 */
- 123 @Test
- 124 public void findRunPersonTask() {
- 125 String taskId = "6704";
- 126 List<IdentityLink> list = processEngine.getTaskService().getIdentityLinksForTask(taskId);
- 127 if (list != null && list.size() > 0) {
- 128 for (IdentityLink identityLink : list) {
- 129 System.out.println(identityLink.getTaskId() + " " + identityLink.getType() + " "
- 130 + identityLink.getProcessInstanceId() + " " + identityLink.getUserId());
- 131 }
- 132 }
- 133 }
- 134
- 135 /**
- 136 * 查询历史任务的办理人表
- 137 */
- 138 @Test
- 139 public void findHistoryPersonTask(){
- 140 String processInstanceId = "6704";
- 141 List<HistoricIdentityLink> list = processEngine.getHistoryService()//
- 142 .getHistoricIdentityLinksForProcessInstance(processInstanceId);
- 143 if(list!=null && list.size()>0){
- 144 for(HistoricIdentityLink identityLink:list){
- 145 System.out.println(identityLink.getTaskId()+" "+identityLink.getType()+" "+identityLink.getProcessInstanceId()+" "+identityLink.getUserId());
- 146 }
- 147 }
- 148 }
- 149
- 150 /**
- 151 * 拾取任务,将组任务分给个人任务,指定任务的办理人字段
- 152 * 拾取之后,便可从查询当前人的个人任务中查询
- 153 */
- 154 @Test
- 155 public void claim(){
- 156 String taskId = "6704";
- 157 //分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
- 158 String userId = "郭靖";
- 159 processEngine.getTaskService()
- 160 .claim(taskId, userId);
- 161 }
- 162
- 163 /**
- 164 * 将个人任务回退到组任务,前提,之前一定是个组任务
- 165 */
- 166 @Test
- 167 public void setAssigee(){
- 168 String taskId = "6704";
- 169 processEngine.getTaskService()
- 170 .setAssignee(taskId, null);
- 171 }
- 172
- 173 /**
- 174 * 向组任务中添加成员(在表act_ru_identitylink中添加)
- 175 */
- 176 @Test
- 177 public void addGroupUser(){
- 178 //任务ID
- 179 String taskId = "6704";
- 180 String userId = "大H";
- 181 processEngine.getTaskService()
- 182 .addCandidateUser(taskId, userId);
- 183 }
- 184
- 185 /**
- 186 * 从组任务中删除成员
- 187 */
- 188 @Test
- 189 public void deleteGroupUser(){
- 190 String taskId = "6704";
- 191 String userId = "大H";
- 192 processEngine.getTaskService()
- 193 .deleteCandidateUser(taskId, userId);
- 194 }
- 195}
3.2 流程图中任务节点的配置
3.3 说明
注意:认领任务的时候,可以是组任务成员中的人,也可以不是组任务成员的人,此时通过Type的类型为participant来指定任务的办理人
- 1组任务及三种分配方式:
- 2 1:在taskProcess.bpmn中直接写 candidate-users=“小A,小B,小C,小D"
- 3 2:在taskProcess.bpmn中写 candidate-users =“#{userIDs}”,变量的值要是String的。
- 4 使用流程变量指定办理人
- 5 Map<String, Object> variables = new HashMap<String, Object>();
- 6 variables.put("userIDs", "大大,小小,中中");
- 7 3: 使用TaskListener接口,使用类实现该接口,在类中定义:
- 8
- 9delegateTask.addCandidateUser(userId1); //添加组任务的用户
- 10delegateTask.addCandidateUser(userId2);
- 11组任务分配给个人任务(认领任务):
- 12 processEngine.getTaskService().claim(taskId, userId);
- 13个人任务分配给组任务:
- 14 processEngine.getTaskService(). setAssignee(taskId, null);
- 15向组任务添加人员:
- 16 processEngine.getTaskService().addCandidateUser(taskId, userId);
- 17向组任务删除人员:
- 18 processEngine.getTaskService().deleteCandidateUser(taskId, userId);
- 19个人任务和组任务存放办理人对应的表:
- 20act_ru_identitylink表存放任务的办理人,包括个人任务和组任务,表示正在执行的任务
- 21act_hi_identitylink表存放任务的办理人,包括个人任务和组任务,表示历史任务
- 22区别在于:如果是个人任务TYPE的类型表示participant(参与者)
- 23 如果是组任务TYPE的类型表示candidate(候选者)和participant(参与者)